package main

import (
	"fmt"
	"encoding/json"
)

type Foo struct {

}

// why this type can compare with nil
type Error struct {
	Id     string `json:"id"`
	Code   string `json:"code"`
	Detail string `json:"detail"`
	Status int32  `json:"status"`
}
func (e Error) Error() string {
	b, _ := json.Marshal(e)
	return string(b)
}

func main() {
	var i interface{}
	i = Foo{}

	fmt.Println(i == nil)
	fmt.Println(&i == nil)

	err := Error{}
	fmt.Println(&err == nil)

	// 验证所谓的接口类型的变量 被空 struct 赋值之后的行为
	var err2 error
	// interface 类型变量的 zero 值应该是 nil
	fmt.Println(err2, err2 == nil)

	// 将一个初始化的 Error 赋值给他
	err2 = Error{}
	fmt.Println(err2, err2 == nil)

	// 将其重复进行赋值为 nil (结果没毛病啊)
	err2 = nil
	fmt.Println(err2, err2 == nil)

	// 将一个 zero 值的指针赋值给他 也就是 C7.5 的问题
	// 第二个判断是 false
	var p3 *Error
	err2 = p3
	fmt.Println("==>", err2, err2 == nil)

	// 再次将其重复进行赋值为 nil (结果没毛病啊)
	err2 = nil
	fmt.Println(err2, err2 == nil)

	// 即便是赋值指针也没有问题
	var err3 error
	err3 = &Error{}
	fmt.Println(err3, err3 == nil)

	// 指针类型的 zero 值
	var t *int
	fmt.Println(t)

	// 这里一定要区分指针类型的变量 和 地址是不一样的
	var t2 *Error
	fmt.Println(t2)
}
